Day 8 조건문, 문자열
Day8 8단계 20231025
1. 간단한 논리 연산
class Solution {
public boolean solution(boolean x1, boolean x2, boolean x3, boolean x4) {
boolean x1x2 = (x1 == false && x2 == false) ? false : true;
boolean x3x4 = (x3 == false && x4 == false) ? false : true;
return (x1x2 == true && x3x4 == true) ? true : false;
}
}
2. 주사위 게임 3
- 내 풀이 : 여러 조건이 주어졌을 때 조건과 결과를 좀 더 단순화할 필요가 있다.
- 매우 길어서 가독성이 많이 떨어진다. 가독성도 챙길 수 있게 줄을 줄여보자.
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
int[] nums = { a, b, c, d };
Map<Integer, Integer> map = new HashMap<>();
int count = 1;
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
count = map.get(nums[i]) + 1;
} else {
count = 1;
}
map.put(nums[i], count);
}
int same = 0;
int diff = 0;
int answer = 0;
Set<Integer> keys = map.keySet();
switch (map.size()) {
case 1:
answer = nums[0] * 1111;
break;
case 2:
for (int i : keys) {
if (map.get(i) == 2) {
if (same == 0) {
same = i;
} else {
diff = i;
answer = (same + diff) * Math.abs((same - diff));
break;
}
} else {
if (map.get(i) == 3) {
same = i;
} else if (map.get(i) == 1) {
diff = i;
}
answer = (int) Math.pow(10 * same + diff, 2);
}
}
break;
case 3:
answer = 1;
for (int i : keys) {
if (map.get(i) != 2) {
answer *= i;
}
}
break;
case 4:
Arrays.sort(nums);
answer = nums[0];
break;
}
return answer;
}
}
- 다른 사람 풀이 : 맵을 사용해서 푼 것은 동일하지만, 조건을 나눌 때 훨씬 단순화했다.
- 맵에 키와 값을 추가할 때 중복되는 키가 들어오면 +1을 해주고, 없으면 getOrDefault() 메소드를 사용해서 1을 새로 추가했다.
- 순환자로 Map의 키와 값을 한 번에 가져오도록 Map.Entry<Integer, Integer> 를 사용하였다.
- 중복 숫자가 2개일 때 결과 처리에서 이해 안가는 부분을 챗gpt로도 확인해보자.
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(a, map.getOrDefault(a, 0) + 1);
map.put(b, map.getOrDefault(b, 0) + 1);
map.put(c, map.getOrDefault(c, 0) + 1);
map.put(d, map.getOrDefault(d, 0) + 1);
if (map.size() == 1) return a * 1111;
if (map.size() == 2) {
if (map.containsValue(3)) {
for (Map.Entry<Integer, Integer> el : map.entrySet())
answer += el.getKey() * (el.getValue() == 3 ? 10 : 1);
return answer * answer;
}
int x = (a + b + c + d - 2 * a) / 2;
return (a + x) * Math.abs(a - x); // 이 부분은 잘 이해가 안간다
}
if (map.size() == 3) {
answer = 1;
for (Map.Entry<Integer, Integer> el : map.entrySet())
if (el.getValue() != 2) answer *= el.getKey();
return answer;
}
return Math.min(Math.min(a, b), Math.min(c, d));
}
}
3. 글자 이어 붙여 문자열 만들기
class Solution {
public String solution(String my_string, int[] index_list) {
StringBuilder sb = new StringBuilder();
for(int i : index_list) {
sb.append(my_string.charAt(i));
}
return sb.toString();
}
}
- 내 풀이 : StringBuilder를 이용해 String의 원하는 문자를 charAt()으로 받고, StringBuilder에 추가
StringBuilder sb = new StringBuilder();
for(int i : index_list) {
sb.append(my_string.charAt(i));
}
- 스트림을 이용한 풀이(다른 사람 풀이) : 정수 배열을 스트림화 시키고, 인덱스 번호에 해당하는 String의 charAt을 String Object로 가져옴
- 위 두 방법은 같은 방법이긴 하지만 스트림의 유무에 따라 타입 변환을 고려해야하는 것이 다르다
Arrays.stream(indexList).mapToObj(i -> String.valueOf(myString.charAt(i))).collect(Collectors.joining());
4. 9로 나눈 나머지
import java.util.stream.Stream;
class Solution {
public int solution(String number) {
return Stream.of(number.split("")).mapToInt(i->Integer.parseInt(i)).sum()%9;
}
}
- 숫자로 쓴 문자열을 정수형으로 만들 때 여러 방법을 쓸 수 있다.
- 루프를 돌려서 각 String 위치의 char를 읽어서 정수로 변환
- 다른 사람 풀이
int sum = 0;
for(int i = 0; i < str.length; i++) {
sum += str.charAt(i) - '0'; // 여기선 '0'과의 연산으로 int형 변환을 했다
}
int answer = sum%9;
- 문자열을 IntStream으로 변환하는 chars()와 Stream의 map() 메소드 사용
- 다른 사람 풀이
return number.chars().map(i -> str.charAt(i)).sum()%9;
- String 전체를 Stream으로 변환 후 합산
- 내 풀이
- 사이즈가 큰 데이터가 아니라서 스트림을 거치기 때문에 for-loop보다 느리다.
return Stream.of(number.split("")).mapToInt(i->Integer.parseInt(i)).sum()%9;
5. 문자열 여러 번 뒤집기
class Solution {
public String solution(String my_string, int[][] queries) {
StringBuilder sb = new StringBuilder(my_string);
StringBuilder rev = new StringBuilder();
for (int i = 0; i < queries.length; i++) {
rev.append(sb.substring(queries[i][0], queries[i][1]+1)).reverse();
sb.replace(queries[i][0], queries[i][1]+1, rev.toString());
rev.setLength(0);
}
return sb.toString();
}
}